from flask_restful import Resource,reqparse,request
from comment.models.index import *
from comment.utils.data2dict import datalist2dict,data2dict
from comment.utils.shopping_redis import redis_client
import json

#商品分类的资源类：
class Shopping_Category(Resource):
    def get(self):
        #从redis读取数据
        data_cache = redis_client.get('index_category')
        if data_cache:  #如果redis中有数据，则返回redis中的数据(缓存在redis中的数据是字符串)
            return json.loads(data_cache)
        else:   #如果Redis中没有数据，则从mysql中查询数据，返回给用户，并且写入redis
            rq = reqparse.RequestParser()
            rq.add_argument('parent_id', required=True, type=int)
            req = rq.parse_args()
            data = self.getData(req.parent_id)
            if data:
                for item in data:
                    item.update({'list': ''})
                    data_second = self.getData(item['id'])
                    item['list'] = data_second
                    for item1 in data_second:
                        item1.update({'list': ''})
                        data_third = self.getData(item1['id'])
                        item1['list'] = data_third
                #把查询到的数据写入redis
                redis_client.setex('index_category',3600*24,json.dumps(data))
                return data
            else:
                return {'message': 'none'}

    # 获取分类数据的静态方法
    @staticmethod
    def getData(parent_id):
        # with_entities指定我们要查询的字段  asc从小到大  desc从大到小
        res = Category.query.with_entities(Category.id, Category.parent_id, Category.name) \
            .filter(Category.parent_id == parent_id).order_by(Category.sort.asc()).all()
        # res是一个对象，需要转换成字典 这是判断是否取到数据
        if res:
            return datalist2dict(res)
        else:
            return 'none'

#测试data2dict
class Dict_test(Resource):
    def get(self):
        #取多条数据（所有字段）
        res = Category.query.filter(Category.parent_id == 0).all()
        if res:
            datalist2dict(res)
        else:
            return 'none'

#首页新品推荐资源类
class Shopping_HomeNewProduct(Resource):
    def get(self):
        data_cache = redis_client.get('index_HomeNewProduct')
        if data_cache:
            return json.loads(data_cache)
        else:
            res = HomeNewProduct.query.join(Product,HomeNewProduct.product_id == Product.id)\
                .with_entities(Product.id,Product.default_pic,Product.price,Product.product_name,
                               Product.rel_category3_id).order_by(HomeNewProduct.sort.asc())\
                .limit(10).all()
            if res:
                data = datalist2dict(res)
                redis_client.setex('index_HomeNewProduct',3600*24,json.dumps(data))
                return data
            else:
                return {'message':'none'}

#人气热搜资源类
class Shopping_HomeRecommendProduct(Resource):
    def get(self):
        data_cache = redis_client.get('index_HomeRecommendProduct')
        if data_cache:
            return json.loads(data_cache)
        else:
            res = HomeRecommendProduct.query.join(Product,HomeRecommendProduct.product_id == Product.id)\
                .with_entities(Product.id,Product.default_pic,Product.price,Product.product_name,
                           Product.rel_category3_id).limit(10).all()
            if res:
                data = datalist2dict(res)
                redis_client.setex('index_HomeRecommendProduct',3600*24,json.dumps(data))
                return data
            else:
                return {'message':'none'}

#首页专题资源类
class Shopping_RecommendSubject(Resource):
    def get(self):
        data_cache = redis_client.get('index_RecommendSubject')
        if data_cache:
            return json.loads(data_cache)
        else:
            res = CmsSubject.query.filter(CmsSubject.show_status == 1).all()
            if res:
                data = datalist2dict(res)
                for i in range(len(data)):
                    res_product = CmsSubjectProductRelation.query.join(Product,CmsSubjectProductRelation.product_id == Product.id)\
                        .filter(data[i]['id'] == CmsSubjectProductRelation.subject_id)\
                        .with_entities(Product.id,Product.default_pic,Product.price,Product.product_name,Product.rel_category3_id)\
                        .limit(10).all()
                    if res_product:
                        data[i]['productList']=datalist2dict(res_product)
                    else:
                        data[i]['productList'] =''
                redis_client.setex('index_RecommendSubject', 3600 * 24, json.dumps(data))
                return data
            else:
                return {'message': 'none'}

